/**
 * 令牌管理工具
 * 处理accessToken和refreshToken的存储、获取、清除等操作
 */

// 存储键名
const TOKEN_KEY = 'access_token';
const REFRESH_TOKEN_KEY = 'refresh_token';
const USER_INFO_KEY = 'user_info';
const TOKEN_EXPIRES_KEY = 'token_expires';
const INVITATION_CODE_KEY = 'invitation_code';

/**
 * 令牌管理类
 */
export class TokenManager {
  /**
   * 设置访问令牌
   * @param {string} token - 访问令牌
   */
  static setAccessToken(token) {
    try {
      uni.setStorageSync(TOKEN_KEY, token);
    } catch (error) {
      console.error('设置访问令牌失败:', error);
    }
  }

  /**
   * 获取访问令牌
   * @returns {string|null} 访问令牌
   */
  static getAccessToken() {
    try {
      return uni.getStorageSync(TOKEN_KEY) || null;
    } catch (error) {
      console.error('获取访问令牌失败:', error);
      return null;
    }
  }

  /**
   * 设置刷新令牌
   * @param {string} token - 刷新令牌
   */
  static setRefreshToken(token) {
    try {
      uni.setStorageSync(REFRESH_TOKEN_KEY, token);
    } catch (error) {
      console.error('设置刷新令牌失败:', error);
    }
  }

  /**
   * 获取刷新令牌
   * @returns {string|null} 刷新令牌
   */
  static getRefreshToken() {
    try {
      return uni.getStorageSync(REFRESH_TOKEN_KEY) || null;
    } catch (error) {
      console.error('获取刷新令牌失败:', error);
      return null;
    }
  }

  /**
   * 设置令牌过期时间
   * @param {number} expiresTime - 过期时间戳
   */
  static setTokenExpires(expiresTime) {
    try {
      uni.setStorageSync(TOKEN_EXPIRES_KEY, expiresTime);
    } catch (error) {
      console.error('设置令牌过期时间失败:', error);
    }
  }

  /**
   * 获取令牌过期时间
   * @returns {number|null} 过期时间戳
   */
  static getTokenExpires() {
    try {
      return uni.getStorageSync(TOKEN_EXPIRES_KEY) || null;
    } catch (error) {
      console.error('获取令牌过期时间失败:', error);
      return null;
    }
  }

  /**
   * 设置用户信息
   * @param {Object} userInfo - 用户信息
   */
  static setUserInfo(userInfo) {
    try {
      uni.setStorageSync(USER_INFO_KEY, JSON.stringify(userInfo));
    } catch (error) {
      console.error('设置用户信息失败:', error);
    }
  }

  /**
   * 获取用户信息
   * @returns {Object|null} 用户信息
   */
  static getUserInfo() {
    try {
      const userInfo = uni.getStorageSync(USER_INFO_KEY);
      return userInfo ? JSON.parse(userInfo) : null;
    } catch (error) {
      console.error('获取用户信息失败:', error);
      return null;
    }
  }

  /**
   * 设置登录信息（包含令牌和用户信息）
   * @param {Object} loginData - 登录返回的数据
   * @param {string} loginData.accessToken - 访问令牌
   * @param {string} loginData.refreshToken - 刷新令牌
   * @param {number} loginData.expiresTime - 过期时间
   * @param {number} loginData.userId - 用户ID
   */
  static setLoginInfo(loginData) {
    const { accessToken, refreshToken, expiresTime, userId } = loginData;
    
    this.setAccessToken(accessToken);
    this.setRefreshToken(refreshToken);
    this.setTokenExpires(expiresTime);
    
    // 设置用户基本信息
    this.setUserInfo({
      userId,
      loginTime: Date.now()
    });
  }

  /**
   * 检查令牌是否过期
   * @returns {boolean} 是否过期
   */
  static isTokenExpired() {
    const expiresTime = this.getTokenExpires();
    if (!expiresTime) return true;
    
    // 提前5分钟判断为过期，避免请求时刚好过期
    const now = Date.now();
    const bufferTime = 5 * 60 * 1000; // 5分钟
    
    return now >= (expiresTime - bufferTime);
  }

  /**
   * 检查是否已登录
   * @returns {boolean} 是否已登录
   */
  static isLoggedIn() {
    const accessToken = this.getAccessToken();
    const refreshToken = this.getRefreshToken();
    
    return !!(accessToken && refreshToken && !this.isTokenExpired());
  }

  /**
   * 清除所有令牌和用户信息
   */
  static clearAll() {
    try {
      uni.removeStorageSync(TOKEN_KEY);
      uni.removeStorageSync(REFRESH_TOKEN_KEY);
      uni.removeStorageSync(USER_INFO_KEY);
      uni.removeStorageSync(TOKEN_EXPIRES_KEY);
      uni.removeStorageSync(INVITATION_CODE_KEY);
    } catch (error) {
      console.error('清除令牌信息失败:', error);
    }
  }

  /**
   * 获取Authorization头部值
   * @returns {string|null} Authorization头部值
   */
  static getAuthorizationHeader() {
    const token = this.getAccessToken();
    return token ? `Bearer ${token}` : null;
  }

  /**
   * 设置邀请码
   * @param {string} invitationCode - 邀请码
   */
  static setInvitationCode(invitationCode) {
    try {
      uni.setStorageSync(INVITATION_CODE_KEY, invitationCode);
    } catch (error) {
      console.error('设置邀请码失败:', error);
    }
  }

  /**
   * 获取邀请码
   * @returns {string|null} 邀请码
   */
  static getInvitationCode() {
    try {
      return uni.getStorageSync(INVITATION_CODE_KEY) || null;
    } catch (error) {
      console.error('获取邀请码失败:', error);
      return null;
    }
  }

  /**
   * 清除邀请码
   */
  static clearInvitationCode() {
    try {
      uni.removeStorageSync(INVITATION_CODE_KEY);
    } catch (error) {
      console.error('清除邀请码失败:', error);
    }
  }
}

export default TokenManager;